﻿using Bear.BLL;
using Bear.Library.Util;
using Bear.Library.WinApi;
using Bear.Models;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace Bear.Scripts
{
    public class 登录 : ScriptBase
    {
        public override void Run(AppConfig config)
        {
            显示说明("等待2秒钟");
            延时(2000);
            string 窗口名 = 启动程序(config.GamePath);

            显示说明("获取窗口标识");
            IntPtr 窗口标识 = 获取窗口标识(窗口名);

            WinApiHelper.MoveWindow(窗口标识, 0, 0, 200, 100, true);

            //获取按钮
            IntPtr 按钮 = 获取按钮(窗口标识, "게임 실행");


            if (按钮 == IntPtr.Zero)
            {
                显示说明("未找到按钮 게임 실행!");
                return;
            }

            显示说明("点击说明框的按钮...");

            点 按钮位置 = 获取按钮位置(按钮);

            鼠标移动(按钮位置.X, 按钮位置.Y);
            延时(200);
            鼠标左键单击();
            显示说明("等待说明框消失...");

            窗口标识 = IntPtr.Zero;
            矩形 矩形 = null;
            while (true)
            {
                延时(5000);
                //重新获取窗口句柄
                窗口标识 = 获取窗口标识(窗口名);

                if (窗口标识 != IntPtr.Zero)
                {
                    显示说明("获取窗口大小");
                    矩形 = 获取窗口大小(窗口标识);
                    显示说明("窗口大小为{0}x{1}", 矩形.宽, 矩形.长);
                    if (矩形.宽 < 800 || 矩形.宽 < 600)
                    {
                        显示说明("窗口大小小于800x600,继续等待");
                        continue;
                    }
                    break;
                }
            }

            显示说明("游戏窗体出现...");
            延时(20000);
            while (true)
            {
                延时(5000);
                显示说明("获取游戏界面...");
                using (Bitmap 窗口图片 = 获取窗口图片(窗口标识))
                {
                    if (窗口图片 != null)
                    {
                        Color 颜色1 = 窗口图片.GetPixel(50, 50);
                        Color 颜色2 = 窗口图片.GetPixel(750, 550);
                        if (颜色1.ToArgb() == -1 || 颜色2.ToArgb() == -1 || 颜色2.ToArgb() == -16777216)
                        {
                            显示说明("游戏进入，等待开场动画...");
                            continue;
                        }
                        break;
                    }
                    else
                    {
                        显示说明("Error:游戏界面图片为空...");
                    }
                }
            }


            显示说明("输入账户名...");


            //鼠标移动到账户名
            int X坐标 = 矩形.左边距 + 矩形.边框宽度 + 425;
            int Y坐标 = 矩形.上边距 + 矩形.标题栏宽度 + 295;

            鼠标移动(X坐标, Y坐标);
            延时(800);
            //双击
            鼠标左键双击();
            延时(1000);
            //输入账户名
            输入字符(config.AccountName);
            延时(1000);

            显示说明("输入密码...");
            鼠标移动(X坐标, Y坐标 + 25);
            延时(800);
            鼠标左键双击();
            延时(1000);
            输入字符(config.AccountPassword);
            延时(1000);

            显示说明("登录游戏...");
            键盘按键(Keys.Enter);
            延时(5000);

            显示说明("进入大区...");
            键盘按键(Keys.Enter);
            延时(3000);


            显示说明("选择频道" + config.Channel + "...");

            for (int i = 0; i < config.Channel / 5; i++)
            {
                键盘按键(Keys.Down);
                延时(500);
            }

            for (int i = 0; i < config.Channel % 5; i++)
            {
                键盘按键(Keys.Right);
                延时(500);
            }
            键盘按键(Keys.Enter);
            延时(2000);

            显示说明("选择人物...");

            //先恢复到首个人物
            for (int i = 0; i < 10; i++)
            {
                键盘按键(Keys.Left);
                延时(500);
            }

            for (int i = 0; i < config.Role; i++)
            {
                键盘按键(Keys.Right);
                延时(500);
            }

            键盘按键(Keys.Enter);
            延时(2000);

            显示说明("获取安全码位置...");

            List<点> 安全码位置 = new List<点>();

            using (Bitmap 窗口图片 = 获取窗口图片(窗口标识))
            {
                foreach (var item in config.SecurityCode.ToCharArray())
                {
                    点 点 = 图片位置(窗口图片, string.Format(@"Data\{0}.png", item), 0.9);

                    安全码位置.Add(点);
                }
            }


            显示说明("输入安全码...");
            foreach (var item in 安全码位置)
            {
                int 坐标X = 矩形.左边距 + 矩形.边框宽度 + item.X;
                int 坐标Y = 矩形.上边距 + 矩形.标题栏宽度 + item.Y;

                鼠标移动(坐标X, 坐标Y);
                延时(500);
                鼠标左键单击();
                延时(800);
            }
            显示说明("进入游戏...");
            键盘按键(Keys.Enter);
            延时(5000);
        }

    }
}
